package org.ww.config;

import org.springframework.context.annotation.*;
import org.ww.bean.Color;
import org.ww.bean.ColorFactoryBean;
import org.ww.bean.Person;
import org.ww.condition.LinuxCondition;
import org.ww.condition.WindowsCondition;

//@Import({Color.class})
@Configuration
public class MainConfig2 {
//    @Scope(value = "prototype")
    /**
     * singleton:默认单实例，在ioc容器创建的时候就会对bean进行实例化，下次获取直接返回该实例
     * prototype:多实例：只有在获取该实例的时候才会创建实例，每次都会创建一个新的实例
     * request：同一个请求中创建一个实例
     * session：同一个会话中创建一个实例
     *
     *
     * @Lazy
     * 懒加载：针对单实例：在容器启动的时候不去加载
     *       在第一次获取实例的时候加载该实例
     */
    @Lazy
    @Bean("person")
    public Person person(){
//        System.out.println("实例正在创建中...");
        return new Person("张三",25);
    }

    /**
     * @Conditional  当满足某个条件时注入该bean
     * 接收实现Condition的类
     * @return
     */
    @Conditional(WindowsCondition.class)
    @Bean("bill")
    public Person person1(){
        return new Person("bill",68);
    }

    @Conditional(LinuxCondition.class)
    @Bean("linus")
    public Person person2(){
        return new Person("linus",48);
    }

    /**
     * 给容器中注册组件
     * 1) 包扫描+给组件加注解的方式（@Controller/@Service/@Repository）
     * 2) @Bean
     * 3) @Import
     *       1 直接导入，id默认为类的全限定类名
     *       2 ImportSelector：自定义类实现该接口，返回需要导入的全限定类名数组
     * 4) 使用Spring提供的@FactoryBean（工厂bean）
     *       1 默认获取的时工厂bean通过getObject方法创建的对象
     *       2 要想获取bean本身，在beanname前边加上“&”
     *
     */

    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }

}
